package Logic

import (
	"fmt"
	"time"
	_ "yz-go/Common"

	"github.com/gin-gonic/gin"
)

type PushData struct {
	ChannelKey  string         `json:"channel_key" `
	ChannelType string         `json:"channel_type"`
	Identities  []IdentitiesST `json:"identities"`
	Identities2 []struct {
		Domain string `json:"domain" `
		Action string `json:"action"`
		Ts     int64  `json:"ts"`
	} `json:"identities2"`
	Messages []MessagesST `json:"messages"`
}

type MessagesST struct {
	Domain       string         `json:"domain" `
	Action       string         `json:"action"`
	Ts           int64          `json:"ts"`
	MessagesData MessagesDataAD `json:"data"`
}

type MessagesDataAD struct {
	Name        string   `json:"name,omitempty" `
	MobilePhone string   `json:"mobilePhone,omitempty"`
	Utm         *UtmData `json:"utm,omitempty"`
	// 非指针字段在默认情况下会使用其已定义的零值（例如 "" 和 0）填充。因此，即使它们是空的，它们仍然会在JSON中以其零值的形式出现
	// 另一方面，当 Utm 和 Props 使用指针时，它们被视为可选字段。只有当它们被赋值为非 nil 值时，才会被包含在生成的JSON中。如果它们为 nil，则会在JSON中被忽略，不占用空间
	Props     *PropsData  `json:"props,omitempty"`
	Event     string      `json:"event,omitempty" `
	EventDate int64       `json:"eventDate,omitempty"`
	ABCData   interface{} `json:"abc,omitempty"`     // any 或者 接口都可以 接收任何参数
	ABCInt    *int64      `json:"abc_int,omitempty"` // 尝试一个指针类型的字面量
}

type ABCDataST struct {
	A1 int `json:"a,omitempty" `
	C2 int `json:"c,omitempty" `
	D3 int `json:"d,omitempty" `
	E4 int `json:"e,omitempty" `
	Ap int `json:"ap,omitempty" `
}

type UtmData struct {
	Source string `json:"source,omitempty" `
	Medium string `json:"medium,omitempty" `
}

type PropsData struct {
	EeeknowDate string `json:"eeeknowDate,omitempty" `
}

type IdentitiesST struct {
	Domain string `json:"domain" `
	Action string `json:"action"`
	Ts     int64  `json:"ts"`
}

func BuildData(c *gin.Context) (rd PushData) {
	data := PushData{}

	MessagesInfo := MessagesST{}
	MessagesDataADA := MessagesDataAD{}

	MessagesInfo2 := MessagesST{}
	MessagesInfo2AD := MessagesDataAD{}

	data.ChannelKey = "udc_10000575iyIh6gb"
	data.ChannelType = "UDC"

	milliseconds := time.Now().UnixNano() / int64(time.Millisecond)
	timeUnix := time.Now().Unix() //已知的时间戳
	formatTimeStr := time.Unix(timeUnix, 0).Format("2006-01-02 15:04:05")

	UtmTmp := UtmData{
		Source: "官网",
		Medium: "来源-小程序",
	}

	PropsTmp := PropsData{
		EeeknowDate: formatTimeStr,
	}

	MessagesDataADA.Utm = &UtmTmp
	MessagesDataADA.Props = &PropsTmp
	MessagesDataADA.Name = "用户名"
	MessagesDataADA.MobilePhone = "13111111111"

	MessagesInfo.Domain = "contact"
	MessagesInfo.Action = "set"
	MessagesInfo.Ts = milliseconds

	var ABCDataInfo = ABCDataST{}
	ABCDataInfo.A1 = 1
	ABCDataInfo.C2 = 12
	ABCDataInfo.D3 = 13
	ABCDataInfo.E4 = 14
	ABCDataInfo.Ap = 15
	MessagesDataADA.ABCData = ABCDataInfo

	MessagesInfo.MessagesData = MessagesDataADA

	// 22
	MessagesInfo2AD.Event = "EEEKNOW_REGISTER_PC"
	MessagesInfo2AD.EventDate = milliseconds

	// ABCInt
	// 方法一：
	// var abc_int *int64 // 错误 这样没有分配空间
	// abc_int := new(int64)	// 需要new来分配空间 下面才可以直接复制
	// *abc_int = 22
	// 方法二：
	abc_int := new(int64)
	*abc_int = 22
	MessagesInfo2AD.ABCInt = abc_int

	var ABCDataInfo2 = ABCDataST{}
	ABCDataInfo2.A1 = 10
	ABCDataInfo2.C2 = 120
	ABCDataInfo2.D3 = 130
	// ABCDataInfo2.E4 = 140
	ABCDataInfo2.Ap = 150
	MessagesInfo2AD.ABCData = ABCDataInfo2

	MessagesInfo2.Domain = "event"
	MessagesInfo2.Action = "track"
	MessagesInfo2.Ts = milliseconds
	MessagesInfo2.MessagesData = MessagesInfo2AD

	data.Messages = append(data.Messages, MessagesInfo)
	data.Messages = append(data.Messages, MessagesInfo2)

	// 换一种方法写 Identities
	IdentitiesInfo2 := []struct {
		Domain string `json:"domain" ` // 后面的json都要加上  就是这么严谨
		Action string `json:"action"`
		Ts     int64  `json:"ts"`
	}{
		{Domain: "Domain1", Action: "Action1", Ts: 123456789},
		{Domain: "Domain2", Action: "Action2", Ts: 123456789},
		{Domain: "Domain3", Action: "Action", Ts: 123456789},
	}

	data.Identities2 = IdentitiesInfo2

	fmt.Println("=======")
	fmt.Printf("%#v\n", data)
	// rd.Data = data
	return data
	// return Common.ResData{Common.SUCCESS, "", data}
}
